#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cmath>
using namespace std;

class Data{
public:
    Data(){ }
    ~Data(){
        cout << "~Data" << endl;
    }

    int getData() const{
        return _data;
    }
private:
    int _data = 10;
};

// 两层结构包装下的使用
class MiddLayer{
public:
    MiddLayer(Data *p)
    :_pdata(p)
    {  }
    ~MiddLayer(){
        if(_pdata){
            delete _pdata;
            _pdata = nullptr;
        }
    }
    // 重装 ->  
    // 因为单->的使用对象是指针，所以要返回一个指针
    Data * operator->(){
        return _pdata;
    }
    // 重装 *
    // 因为*的使用是一个对象的解引用，返回值是一个对象
    Data & operator*(){
        return *_pdata;
    }
private:
    Data * _pdata;
};

void test(){
    Data * p = new Data();
    MiddLayer ml(p);
    int value = p->getData();
    cout << value << endl;
    cout << "-----------" << endl;
    cout << (*p).getData() << endl;
}

int main(int atgc, char * argv[])
{
    test();
    return 0;
}

